#include <iostream>
#include <map>
using namespace std;



// pair的构造函数
// copy / 即是构造，也是拷贝构造，
// template<class U, class V> pair (const pair<U,V>& pr);
// template<class U, class V> pair (pair<U,V>&& pr);
// pair (const pair& pr) = default;
// pair (pair&& pr) = default;

void test_map1()//C++或者C语言在编译多个源文件时，注意不同源文件之间的函数名如若相同，就值得我们去注意，根本原因就是链接时形成符号表的时候，形成了同名函数问题
{
    map<string,string> m;
    m.insert(pair<string,string>("granite","花岗岩"));
    m.insert(pair<const char*,const char*>("marble","大理石"));//这里由于pair构造函数使用的模版，使用的模版，所以你传char*也是合理的
    m.insert(make_pair("lithosphere","岩石圈"));//用make_pair就很省去显示实例化的麻烦，这里实质就是先传的是const char *，再让make_pair去实例化
    m.insert(map<string,string>::value_type("basalt","玄武岩"));
    m.insert(map<string,string>::value_type("slate","板岩"));
    map<string,string>::iterator it = m.begin();
    
    m["rock"];//插入了个空的，默认的构造的string
    cout<<m["rock"]<<endl;

    m["rock"] = "岩石";//修改
    cout<<m["rock"]<<endl;
    while(it != m.end())
    {
        cout<<it->first<<endl;//可以直接使用解引用，因为是一个自定义类型
        cout<<it++->second<<endl;
    }
    for(auto & str:m)
    {
        // str.first+="ERROR";//这里是不支持key修改值的，这显然也合理，毕竟key是索引值
        cout<<str.first<<endl;
        cout<<str.second<<endl;
    }

}

void test_map2(){
    string arr[] = { "苹果", "西瓜", "苹果", "西瓜", "苹果", "苹果", "西瓜","苹果", "香蕉", "苹果", "香蕉" };
    map<string, int> m;
    for(auto& str:arr)
    {
        // auto it = m.find(str);
        // if(it == m.end())//没有这个元素
        // {
        //     m.insert(make_pair(str,1));
        //     continue;
        // }
        // else
        // {
        //     it->second++;
        // }

        m[str]++;//在map里面，提供了[]的接口，可以替代上面
        //其底层实际就是调用了一次insert
        //(*((this->insert(make_pair(k,mapped_type()))).first)).
        //有了，那个key值，就会插入失败，并且对当前节点修改
        //这表征了，如果再次插入相同的值，map就不会再多
        //mutimap就可以可以插入多个相同的key值当value值不同
    }
}



int main()
{
    test_map1();
    return 0;
}